﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
// 原题连接：https://www.nowcoder.com/practice/4edf6e6d01554870a12f218c94e8a299?tpId=196&tqId=37562&ru=/exam/oj

/*
题目描述：
有 n 个活动即将举办，每个活动都有开始时间与活动的结束时间，第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动，换句话说，一个主持人参与了第 i 个活动，那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动，最少需要多少名主持人。

数据范围:
1
≤
n
≤
1
0
5
1≤n≤10
5
  ，
−
2
32
≤
s
t
a
r
t
i
≤
e
n
d
i
≤
2
31
−
1
−2
32
 ≤start
i
​
 ≤end
i
​
 ≤2
31
 −1

复杂度要求：时间复杂度
O
(
n
log
⁡
n
)
O(nlogn) ，空间复杂度
O
(
n
)
O(n)
示例1
输入：
2,[[1,2],[2,3]]
复制
返回值：
1
复制
说明：
只需要一个主持人就能成功举办这两个活动
示例2
输入：
2,[[1,3],[2,4]]
复制
返回值：
2
复制
说明：
需要两个主持人才能成功举办这两个活动
备注：
1
≤
n
≤
1
0
5
1≤n≤10
5

s
t
a
r
t
i
,
e
n
d
i
start
i
​
 ,end
i
​
 在int范围内
*/

// 开始解题：
// 方法——排序 + 堆
class Solution {
public:
    int minmumNumberOfHost(int n, vector<vector<int> >& nums) {
        // 排序
        sort(nums.begin(), nums.end());
        priority_queue<int, vector<int>, greater<int>> heap; //小根堆
        for (int i = 0; i < n; i++) {
            vector<int>& v = nums[i];
            if (heap.empty()) {
                heap.push(v[1]); // 只需要存区间的右端点
            }
            else {
                // 也只需要和右端点比较
                int top = heap.top();
                if (top <= v[0]) {
                    heap.pop(); // 更新原来的右端点
                    heap.push(v[1]);
                }
                else {
                    // 新插入右端点
                    heap.push(v[1]);
                }
            }
        }
        return heap.size();
    }
};